{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    ">                                  第四周作业\n",
    "> \n",
    "> 作业要求：根据活动的关键词（count_1, count_2, ..., count_100，count_other属性）做聚类\n",
    "> \n",
    ">                                                                刘茜茜/2018-8-6"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 导入工具包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "#import cPickle\n",
    "import _pickle as pickle #python3没有cPickle，只有_pickle\n",
    "import itertools\n",
    "\n",
    "#处理事件字符串\n",
    "import time\n",
    "import datetime\n",
    "\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import scipy.io as sio\n",
    "import scipy.sparse as ss\n",
    "\n",
    "#相似度/距离\n",
    "import scipy.spatial.distance as ssd\n",
    "\n",
    "from collections import defaultdict\n",
    "from sklearn.preprocessing import normalize\n",
    "\n",
    "import matplotlib.pyplot as plt   #画图\n",
    "import seaborn as sns\n",
    "\n",
    "from sklearn.cluster import MiniBatchKMeans\n",
    "from sklearn import metrics"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1.数据探索"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "path = './data/'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user</th>\n",
       "      <th>event</th>\n",
       "      <th>invited</th>\n",
       "      <th>timestamp</th>\n",
       "      <th>interested</th>\n",
       "      <th>not_interested</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>3044012</td>\n",
       "      <td>1918771225</td>\n",
       "      <td>0</td>\n",
       "      <td>2012-10-02 15:53:05.754000+00:00</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>3044012</td>\n",
       "      <td>1502284248</td>\n",
       "      <td>0</td>\n",
       "      <td>2012-10-02 15:53:05.754000+00:00</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3044012</td>\n",
       "      <td>2529072432</td>\n",
       "      <td>0</td>\n",
       "      <td>2012-10-02 15:53:05.754000+00:00</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3044012</td>\n",
       "      <td>3072478280</td>\n",
       "      <td>0</td>\n",
       "      <td>2012-10-02 15:53:05.754000+00:00</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>3044012</td>\n",
       "      <td>1390707377</td>\n",
       "      <td>0</td>\n",
       "      <td>2012-10-02 15:53:05.754000+00:00</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      user       event  invited                         timestamp  interested  \\\n",
       "0  3044012  1918771225        0  2012-10-02 15:53:05.754000+00:00           0   \n",
       "1  3044012  1502284248        0  2012-10-02 15:53:05.754000+00:00           0   \n",
       "2  3044012  2529072432        0  2012-10-02 15:53:05.754000+00:00           1   \n",
       "3  3044012  3072478280        0  2012-10-02 15:53:05.754000+00:00           0   \n",
       "4  3044012  1390707377        0  2012-10-02 15:53:05.754000+00:00           0   \n",
       "\n",
       "   not_interested  \n",
       "0               0  \n",
       "1               0  \n",
       "2               0  \n",
       "3               0  \n",
       "4               0  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_df = pd.read_csv( path + \"train.csv\")\n",
    "train_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "n_train = len(train_df)\n",
    "n_train_user_unique = len(train_df.user.unique())                                     \n",
    "n_train_event_unique = len(train_df.event.unique())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 15398 entries, 0 to 15397\n",
      "Data columns (total 6 columns):\n",
      "user              15398 non-null int64\n",
      "event             15398 non-null int64\n",
      "invited           15398 non-null int64\n",
      "timestamp         15398 non-null object\n",
      "interested        15398 non-null int64\n",
      "not_interested    15398 non-null int64\n",
      "dtypes: int64(5), object(1)\n",
      "memory usage: 721.9+ KB\n"
     ]
    }
   ],
   "source": [
    "train_df.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "15398条样本，没有缺失值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练数据集有15398条样本，去重的用户数是2034个，参加的活动有8846个\n"
     ]
    }
   ],
   "source": [
    "print('%s有%d条样本，去重的用户数是%d个，参加的活动有%d个'%('训练数据集',n_train,n_train_user_unique,n_train_event_unique))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 测试集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user</th>\n",
       "      <th>event</th>\n",
       "      <th>invited</th>\n",
       "      <th>timestamp</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1776192</td>\n",
       "      <td>2877501688</td>\n",
       "      <td>0</td>\n",
       "      <td>2012-11-30 11:39:01.230000+00:00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1776192</td>\n",
       "      <td>3025444328</td>\n",
       "      <td>0</td>\n",
       "      <td>2012-11-30 11:39:01.230000+00:00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1776192</td>\n",
       "      <td>4078218285</td>\n",
       "      <td>0</td>\n",
       "      <td>2012-11-30 11:39:01.230000+00:00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1776192</td>\n",
       "      <td>1024025121</td>\n",
       "      <td>0</td>\n",
       "      <td>2012-11-30 11:39:01.230000+00:00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1776192</td>\n",
       "      <td>2972428928</td>\n",
       "      <td>0</td>\n",
       "      <td>2012-11-30 11:39:21.985000+00:00</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      user       event  invited                         timestamp\n",
       "0  1776192  2877501688        0  2012-11-30 11:39:01.230000+00:00\n",
       "1  1776192  3025444328        0  2012-11-30 11:39:01.230000+00:00\n",
       "2  1776192  4078218285        0  2012-11-30 11:39:01.230000+00:00\n",
       "3  1776192  1024025121        0  2012-11-30 11:39:01.230000+00:00\n",
       "4  1776192  2972428928        0  2012-11-30 11:39:21.985000+00:00"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_df = pd.read_csv( path + \"test.csv\")\n",
    "test_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "n_test = len(test_df)\n",
    "n_test_user_unique = len(test_df.user.unique())                                     \n",
    "n_test_event_unique = len(test_df.event.unique())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 10237 entries, 0 to 10236\n",
      "Data columns (total 4 columns):\n",
      "user         10237 non-null int64\n",
      "event        10237 non-null int64\n",
      "invited      10237 non-null int64\n",
      "timestamp    10237 non-null object\n",
      "dtypes: int64(3), object(1)\n",
      "memory usage: 320.0+ KB\n"
     ]
    }
   ],
   "source": [
    "test_df.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "10237条样本，没有缺失值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "测试数据集有10237条样本，去重的用户数是1357个，参加的活动有6173个\n"
     ]
    }
   ],
   "source": [
    "print('%s有%d条样本，去重的用户数是%d个，参加的活动有%d个'%('测试数据集',n_test,n_test_user_unique,n_test_event_unique))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## events数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>event_id</th>\n",
       "      <th>user_id</th>\n",
       "      <th>start_time</th>\n",
       "      <th>city</th>\n",
       "      <th>state</th>\n",
       "      <th>zip</th>\n",
       "      <th>country</th>\n",
       "      <th>lat</th>\n",
       "      <th>lng</th>\n",
       "      <th>c_1</th>\n",
       "      <th>...</th>\n",
       "      <th>c_92</th>\n",
       "      <th>c_93</th>\n",
       "      <th>c_94</th>\n",
       "      <th>c_95</th>\n",
       "      <th>c_96</th>\n",
       "      <th>c_97</th>\n",
       "      <th>c_98</th>\n",
       "      <th>c_99</th>\n",
       "      <th>c_100</th>\n",
       "      <th>c_other</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>684921758</td>\n",
       "      <td>3647864012</td>\n",
       "      <td>2012-10-31T00:00:00.001Z</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>244999119</td>\n",
       "      <td>3476440521</td>\n",
       "      <td>2012-11-03T00:00:00.001Z</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3928440935</td>\n",
       "      <td>517514445</td>\n",
       "      <td>2012-11-05T00:00:00.001Z</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2582345152</td>\n",
       "      <td>781585781</td>\n",
       "      <td>2012-10-30T00:00:00.001Z</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1051165850</td>\n",
       "      <td>1016098580</td>\n",
       "      <td>2012-09-27T00:00:00.001Z</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 110 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     event_id     user_id                start_time city state  zip country  \\\n",
       "0   684921758  3647864012  2012-10-31T00:00:00.001Z  NaN   NaN  NaN     NaN   \n",
       "1   244999119  3476440521  2012-11-03T00:00:00.001Z  NaN   NaN  NaN     NaN   \n",
       "2  3928440935   517514445  2012-11-05T00:00:00.001Z  NaN   NaN  NaN     NaN   \n",
       "3  2582345152   781585781  2012-10-30T00:00:00.001Z  NaN   NaN  NaN     NaN   \n",
       "4  1051165850  1016098580  2012-09-27T00:00:00.001Z  NaN   NaN  NaN     NaN   \n",
       "\n",
       "   lat  lng  c_1   ...     c_92  c_93  c_94  c_95  c_96  c_97  c_98  c_99  \\\n",
       "0  NaN  NaN    2   ...        0     1     0     0     0     0     0     0   \n",
       "1  NaN  NaN    2   ...        0     0     0     0     0     0     0     0   \n",
       "2  NaN  NaN    0   ...        0     0     0     0     0     0     0     0   \n",
       "3  NaN  NaN    1   ...        0     0     0     0     0     0     0     0   \n",
       "4  NaN  NaN    1   ...        0     0     0     0     0     0     0     0   \n",
       "\n",
       "   c_100  c_other  \n",
       "0      0        9  \n",
       "1      0        7  \n",
       "2      0       12  \n",
       "3      0        8  \n",
       "4      0        9  \n",
       "\n",
       "[5 rows x 110 columns]"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "events_df = pd.read_csv( path + \"events.csv\")\n",
    "events_df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "读取数据已经很慢了，因为数据比较大（1.2G）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3137972"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "n_event_eventid_unique = len(events_df.event_id.unique())\n",
    "n_event_eventid_unique"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 3137972 entries, 0 to 3137971\n",
      "Columns: 110 entries, event_id to c_other\n",
      "dtypes: float64(2), int64(103), object(5)\n",
      "memory usage: 2.6+ GB\n"
     ]
    }
   ],
   "source": [
    "events_df.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "共3137972条数据，由于数据集比较大，info信息中没给出数据缺失情况统计，下面考虑使用图表的方式进行分析"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 缺失值可视化分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 计算数据缺失率,按升序排列\n",
    "missing_data = (events_df.isnull().sum()/events_df.isnull().count()).sort_values(ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "# missing_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5,1,'The missing data percentage of each features')"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x360 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(12, 5))\n",
    "sns.barplot(y=missing_data.index[:10], x=missing_data[:10])\n",
    "plt.title('The missing data percentage of each features', fontsize=15)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 由图分析可知\n",
    "    - 数据的缺失主要集中在zip,state,city,county,lng,lat等与地理位置有关的特征上\n",
    "    - 关键词特征没有缺失值\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2.抽取出只在训练集和测试集中出现的event"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "number of unique_events: 13418\n"
     ]
    }
   ],
   "source": [
    "# 我的\n",
    "# 统计训练集和测试集中有哪些活动\n",
    "unique_events = set()\n",
    "    \n",
    "for filename in [path+'train.csv', path+'test.csv']:\n",
    "    f = open(filename, 'rb')\n",
    "    \n",
    "    #忽略第一行（列名字）\n",
    "    f.readline().decode().strip().split(\",\")\t#python3明确区分like bytes和str\n",
    "    \n",
    "    for line in f:\t\t\t#对每条记录进行处理，将活动ID放进set集合\n",
    "        cols = line.decode().strip().split(\",\")\n",
    "        eId = cols[1]\t\t#第一列为用户ID,第二列为活动ID\n",
    "        unique_events.add(int(eId))\n",
    "    f.close()\n",
    "\n",
    "    \n",
    "print('number of unique_events: %d'%len(unique_events))\n",
    "\n",
    "#重新编码活动索引字典\n",
    "events_dict = dict()\n",
    "for i, e in enumerate(unique_events):\n",
    "    events_dict[e] = i   \n",
    "\n",
    "# 新建稀疏矩阵，存储关键词特征\n",
    "count_matrix = ss.dok_matrix((len(events_dict), 101))\n",
    "\n",
    "# 在events.csv中取出词频特征变量\n",
    "file_events=open(path+'events.csv','rb')\n",
    "file_events.readline()\n",
    "for line in file_events:\n",
    "    cols=line.decode().strip().split(',')       # 字符串数组\n",
    "    if ( int(cols[0]) in events_dict ):\n",
    "        i=events_dict[int(cols[0])]\n",
    "        for j in range(0,101):\n",
    "            count_matrix[i,j]=int(cols[j+9])\n",
    "file_events.close()   \n",
    "\n",
    "# 保存最终结果\n",
    "pickle.dump(count_matrix, open(\"count_matrix.pkl\", 'wb')) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3.聚类分析"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据预处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.,  0.,  0., ...,  0.,  0., 20.],\n",
       "       [ 0.,  0.,  0., ...,  0.,  0., 12.],\n",
       "       [ 0.,  7.,  2., ...,  0.,  0., 76.],\n",
       "       ...,\n",
       "       [ 0.,  0.,  0., ...,  0.,  0., 34.],\n",
       "       [ 0.,  0.,  0., ...,  0.,  0., 73.],\n",
       "       [ 0.,  0.,  0., ...,  0.,  0.,  2.]])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train = pickle.load(open(\"count_matrix.pkl\", 'rb'))\n",
    "train = train.toarray()\n",
    "train"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## KMeans聚类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 一个参数点（聚类数据为K）的模型，在校验集上评价聚类算法性能\n",
    "def K_cluster_KMeans(K, X_train):\n",
    "    start = time.time()\n",
    "    \n",
    "    print(\"K-means begin with clusters: {}\".format(K));\n",
    "    \n",
    "    #K-means,在训练集上训练\n",
    "    mb_kmeans = MiniBatchKMeans(n_clusters = K)\n",
    "    mb_kmeans.fit(X_train)\n",
    "    \n",
    "    # 在训练集和测试集上测试\n",
    "    y_train_pred = mb_kmeans.fit_predict(X_train)\n",
    "    \n",
    "    #以前两维特征打印训练数据的分类结果\n",
    "    #plt.scatter(X_train[:, 0], X_train[:, 1], c=y_pred)\n",
    "    #plt.show()\n",
    "\n",
    "    # K值的评估标准\n",
    "    #常见的方法有轮廓系数Silhouette Coefficient和Calinski-Harabasz Index\n",
    "    #这两个分数值越大则聚类效果越好\n",
    "    CH_score = metrics.calinski_harabaz_score(X_train,y_train_pred)\n",
    "    SH_score = metrics.silhouette_score(X_train,y_train_pred)\n",
    "    \n",
    "    \n",
    "    end = time.time()\n",
    "    print(\"CH_score: {},SH_score: {}, time elaps:{}\".format(CH_score, SH_score,int(end-start)))\n",
    "    \n",
    "    return CH_score,SH_score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "K-means begin with clusters: 10\n",
      "CH_score: 1086.5316937802631,SH_score: 0.37511791666495486, time elaps:6\n",
      "K-means begin with clusters: 20\n",
      "CH_score: 2687.469117480399,SH_score: 0.20335677662999985, time elaps:6\n",
      "K-means begin with clusters: 30\n",
      "CH_score: 347.51160476888566,SH_score: 0.179588261556461, time elaps:6\n",
      "K-means begin with clusters: 40\n",
      "CH_score: 274.62122971866137,SH_score: 0.11687134254486524, time elaps:6\n",
      "K-means begin with clusters: 50\n",
      "CH_score: 554.0764974573333,SH_score: 0.1603281607252514, time elaps:6\n",
      "K-means begin with clusters: 60\n",
      "CH_score: 241.26131000742942,SH_score: 0.1145970108431927, time elaps:6\n",
      "K-means begin with clusters: 70\n",
      "CH_score: 164.84180872725426,SH_score: 0.08927497642927257, time elaps:6\n",
      "K-means begin with clusters: 80\n",
      "CH_score: 345.8696823732056,SH_score: 0.07247105743155842, time elaps:6\n",
      "K-means begin with clusters: 90\n",
      "CH_score: 157.50777265289713,SH_score: 0.10154590945166188, time elaps:6\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1008x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# KMeans的聚类数目超参数搜索\n",
    "Ks = range(10,100,10)     # 聚类个数\n",
    "CH_score = []\n",
    "SH_score = []\n",
    "for K in Ks:\n",
    "    v1, v2 = K_cluster_KMeans( K, train )\n",
    "    CH_score.append(v1)\n",
    "    SH_score.append(v2)\n",
    "\n",
    "    \n",
    "# 可视化分析评价超参数搜索结果\n",
    "plt.figure(figsize=(14,4))\n",
    "plt.subplot(1,2,1)\n",
    "plt.plot(Ks, CH_score, marker='+',label='KMeans - CH_score')\n",
    "plt.legend(loc='best')\n",
    "plt.grid(True,linestyle='-.')\n",
    "plt.subplot(1,2,2)\n",
    "plt.plot(Ks, SH_score, marker='s', label='KMeans - SH_score')\n",
    "plt.legend(loc='best')\n",
    "plt.grid(True,linestyle='-.')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "结论:k-means聚类时K取10时聚类效果最好，轮廓系数约为0.39，聚类特征适中吧但是没有超过0.5;"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
